/* Corrección de funciones de dropeo y recreación de vistas
   Ahora considera mayusculas y grants
   
*/ 

CREATE SCHEMA IF NOT EXISTS abaco_utiles;

CREATE OR REPLACE FUNCTION abaco_utiles.aavistasdropear(
	)
    RETURNS boolean
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
  cursor_vistas REFCURSOR;
  vEsquema varchar;
  vVista   varchar;
  vSQL     varchar;
  
BEGIN
  IF (SELECT COUNT(*) FROM pg_views WHERE schemaname not in ('pg_catalog','information_schema')) = 0 THEN 
     RAISE EXCEPTION 'ERROR GRAVE: No hay vistas. Puede ser que haya ejecutado un script incorrectamente, debe continuar la migracion en forma manual';
  END IF;

  DROP TABLE IF EXISTS abaco_utiles.vistas;
  DROP TABLE IF EXISTS abaco_utiles.grants;
  
  CREATE TABLE abaco_utiles.vistas (orden integer, esquema varchar, vista varchar, sql varchar);
  CREATE TABLE abaco_utiles.grants (esquema varchar, vista varchar, grantee varchar, privilege_type varchar);
  
  INSERT INTO abaco_utiles.vistas 
  SELECT 0, schemaname, viewname, definition FROM pg_catalog.pg_views 
  WHERE schemaname not in ('pg_catalog','information_schema');

  INSERT INTO abaco_utiles.grants 
  SELECT table_schema, table_name, grantee, privilege_type FROM information_schema.role_table_grants
  WHERE table_schema NOT IN ('pg_catalog','information_schema');

  OPEN cursor_vistas FOR
       SELECT esquema, vista, sql
       FROM abaco_utiles.vistas;

  FETCH cursor_vistas INTO vEsquema, vVista, vSQL;
  LOOP
    EXIT WHEN (NOT FOUND);
	IF (vVista = lower(vVista)) THEN
       EXECUTE 'ALTER TABLE IF EXISTS ' || vEsquema || '.' || vVista || ' OWNER TO abacouser';
       EXECUTE 'DROP VIEW IF EXISTS ' || vEsquema || '.' || vVista || ' CASCADE';
	ELSE
       EXECUTE 'ALTER TABLE IF EXISTS ' || vEsquema || '."' || vVista || '" OWNER TO abacouser';
       EXECUTE 'DROP VIEW IF EXISTS '   || vEsquema || '."' || vVista || '" CASCADE';
    END IF;
		
    FETCH cursor_vistas INTO vEsquema, vVista, vSQL;
  END LOOP;
  RETURN True;
END;
$BODY$;

ALTER FUNCTION abaco_utiles.aavistasdropear()
    OWNER TO abacouser;


CREATE OR REPLACE FUNCTION abaco_utiles.aavistasrestaurar(
	)
    RETURNS boolean
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
  cursor_vistas REFCURSOR;
  vEsquema varchar;
  vVista   varchar;
  vSQL     varchar;
  vGrantee varchar;
  vPrivilege_type varchar;

BEGIN
 
  PERFORM (SELECT abaco_utiles.aaVistasGenerarDependientes());
  PERFORM (SELECT abaco_utiles.aaVistasOrdenar());

  OPEN cursor_vistas FOR
       SELECT esquema, vista, sql
       FROM abaco_utiles.vistas 
       ORDER BY orden, esquema, vista;

  FETCH cursor_vistas INTO vEsquema, vVista, vSQL;
  LOOP
    EXIT WHEN (NOT FOUND);
    vSQL = replace(vSQL,'postgres','abacouser');
	IF (vVista = lower(vVista)) THEN 
    	EXECUTE 'CREATE OR REPLACE VIEW ' || vEsquema || '.' || vVista || ' AS ' || vSQL;
    ELSE
		EXECUTE 'CREATE OR REPLACE VIEW ' || vEsquema || '."' || vVista || '" AS ' || vSQL;
    END IF;
	FETCH cursor_vistas INTO vEsquema, vVista, vSQL;
  END LOOP;
  CLOSE cursor_vistas;
  
  OPEN cursor_vistas FOR
       SELECT vistas.esquema, vistas.vista, grants.grantee, grants.privilege_type
       FROM abaco_utiles.vistas vistas
	   INNER JOIN abaco_utiles.grants grants on (vistas.esquema = grants.esquema and vistas.vista = grants.vista)
       ORDER BY vistas.esquema, vistas.vista, grants.grantee, grants.privilege_type; -- el orden es al pedo

  FETCH cursor_vistas INTO vEsquema, vVista, vGrantee, vPrivilege_type;
  LOOP
    EXIT WHEN (NOT FOUND);
	IF (vVista = lower(vVista)) THEN 
		EXECUTE 'GRANT ' || vPrivilege_type || ' ON TABLE ' || vEsquema || '.' || vVista || ' TO ' || vGrantee;
	ELSE
		EXECUTE 'GRANT ' || vPrivilege_type || ' ON TABLE ' || vEsquema || '."' || vVista || '" TO ' || vGrantee;
	END IF;
	FETCH cursor_vistas INTO vEsquema, vVista, vGrantee, vPrivilege_type;
  END LOOP;
  CLOSE cursor_vistas;
  
  RETURN True;
END;
$BODY$;

ALTER FUNCTION abaco_utiles.aavistasrestaurar()
    OWNER TO abacouser;

-- =====================================================

SELECT aaVersion('488.04','488.03');

-- =====================================================

